# Cargo las librerías
library(sf)
library(tidyverse)
library(mapdeck)
library(knitr)
library(kableExtra)
#devtools::install_github("meneos/elecciones") # <--- Instala la librería elecciones
library(elecciones)Empezamos importanto el shapefile de la Comunidad de Madrid y selecciono solo la ciudad de Madrid.
shp <- read_sf("~/Google Drive/DATOS/R/COMPORTAMIENTO ELECTORAL/shp/Comunidad de Madrid/2015/corregido/secciones_corregidas.shp", quiet = T) ### Importo el shapefile
shp <- shp[substr(shp$GEOCODIGO, 1, 3) == "079",] # Selecciono solo la ciudad de Madrid
shp <- st_transform(shp, 4326) # Transformo la proyecciónMe descargo los resultados a nivel de mesa de las elecciones municipales de mayo de 2015 y me quedo solo con los de la ciudad de Madrid.
results.muni <- mesas("municipales", "2015", "05") # Descargo los datos
results.muni <- results.muni[results.muni$provincia == "28" & results.muni$municipio == "079",] # 28 = Comunidad de Madrid | 079 = Ciudad de Madrid
ktab <- kable(head(results.muni), digits = 4, align = "l", row.names = F)
kable_styling(ktab, bootstrap_options = c("striped", "hover")) %>% scroll_box(width = "100%", height = "200px")| eleccion | year | mes | partido | ccaa | provincia | municipio | distrito | seccion | mesa | censo.INE | CERA | CERE | votantes.CERE | blancos | nulos | candidaturas | votos | siglas | denominacion | code.provincia | code.autonomia | code.nacional |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 13 | 186 | A | 836 | 836 | 12 | 0 | 3 | 3 | 511 | 200 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 08 | 006 | U | 764 | 764 | 2 | 0 | 9 | 3 | 580 | 69 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 13 | 057 | U | 1006 | 1006 | 9 | 0 | 5 | 3 | 582 | 207 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 02 | 040 | A | 739 | 739 | 7 | 0 | 2 | 4 | 528 | 187 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 07 | 034 | A | 622 | 622 | 9 | 0 | 1 | 4 | 413 | 132 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
| 04 | 2015 | 05 | 120806 | 12 | 28 | 079 | 08 | 164 | A | 786 | 786 | 7 | 0 | 5 | 4 | 603 | 148 | AhoraMadrid | AHORA MADRID | 000806 | 000806 | 000806 |
Los datos se descargan a nivel de mesa electoral pero yo los quiero a nivel de sección censal. Así que agrupo los datos y me quedo solo con los cinco partidos más votados.
# Agrupo los datos
seccs.muni <- results.muni %>%
group_by(year, mes, municipio, distrito, seccion, siglas) %>%
summarise(censo = sum(censo.INE),
votos.candidatura = sum(candidaturas),
votos = sum(votos))
# Selecciono a los cinco partidos
seccs.muni <- seccs.muni[seccs.muni$siglas %in% c("P.P.", "C's", "AhoraMadrid", "P.S.O.E.", "IZQUIERDA U"),]
# Transformo los datos de formato long a wide
seccs.muni <- spread(seccs.muni, key = siglas, value = votos)
# Calculo los % sobre censo
seccs.muni$PP_pct <- round((seccs.muni$P.P. / seccs.muni$censo ) * 100, 2)
seccs.muni$PSOE_pct <- round(( seccs.muni$P.S.O.E. / seccs.muni$censo ) * 100, 2)
seccs.muni$AM_pct <- round(( seccs.muni$AhoraMadrid / seccs.muni$censo ) * 100, 2)
seccs.muni$Cs_pct <- round(( seccs.muni$`C's` / seccs.muni$censo ) * 100, 2)
ktab <- kable(head(seccs.muni), digits = 4, align = "l", row.names = F)
kable_styling(ktab, bootstrap_options = c("striped", "hover")) %>% scroll_box(width = "100%", height = "200px")| year | mes | municipio | distrito | seccion | censo | votos.candidatura | AhoraMadrid | C’s | IZQUIERDA U | P.P. | P.S.O.E. | PP_pct | PSOE_pct | AM_pct | Cs_pct |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2015 | 05 | 079 | 01 | 001 | 867 | 588 | 215 | 62 | 4 | 217 | 73 | 25.03 | 8.42 | 24.80 | 7.15 |
| 2015 | 05 | 079 | 01 | 002 | 661 | 427 | 224 | 38 | 6 | 102 | 44 | 15.43 | 6.66 | 33.89 | 5.75 |
| 2015 | 05 | 079 | 01 | 003 | 1126 | 693 | 265 | 52 | 18 | 264 | 75 | 23.45 | 6.66 | 23.53 | 4.62 |
| 2015 | 05 | 079 | 01 | 004 | 963 | 689 | 279 | 71 | 2 | 247 | 64 | 25.65 | 6.65 | 28.97 | 7.37 |
| 2015 | 05 | 079 | 01 | 006 | 1298 | 899 | 405 | 92 | 11 | 286 | 68 | 22.03 | 5.24 | 31.20 | 7.09 |
| 2015 | 05 | 079 | 01 | 007 | 645 | 431 | 213 | 44 | 4 | 124 | 35 | 19.22 | 5.43 | 33.02 | 6.82 |
Creo una columna en el data frame de los datos con valores identificadores de cada seccion censal que ya está presente en el shapefile para fusionar datos y shapefile.
seccs.muni$GEOCODIGO <- paste0(seccs.muni$municipio, seccs.muni$distrito, seccs.muni$seccion)
shp <- merge(shp, seccs.muni, by = "GEOCODIGO")Uso la librería mapdeck para visualizar un mapa del voto a Ahora Madrid.
# Introducir el token de Mapbox
tkn <- readLines("~/Google Drive/DATOS/R/MAPAS MAS MADRID/token.txt")
# Para el panel hover
shp$info <- paste0("<br><b> Sobre censo</br></b>",
"<br><b>", "PP: ", "</b>", shp$PP_pct, " %", "</br>",
"<br><b>", "Ahora Madrid: ", "</b>" ,shp$AM_pct, " %", "</br>",
"<br><b>", "PSOE: ", "</b>" ,shp$PSOE_pct, " %", "</br>",
"<br><b>", "Ciudadanos: ", "</b>" ,shp$Cs_pct, " %", "</br>")
# Rampa de colores
m <- grDevices::colorRamp(c("#e1f7f2", "#26a58e"))( (1:256)/256 )
mapdeck(token = tkn,
width = 1600/2,
height = 900/2,
style = mapdeck_style(style = "light"),
location = c(-3.71133, 40.42244),
zoom = 9) %>%
add_polygon(data = shp,
layer_id = "AM",
fill_colour = "AM_pct", palette = m,
tooltip = "info",
fill_opacity = 200, legend = T,
update_view = F,
legend_options = list(title = "Ahora Madrid",
subtitle = "Sobre censo",
css = "font-family: Roboto Condensed"))